package com.guoxue.auth;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.springframework.stereotype.Component;

import com.guoxue.util.DESUtil;
@Component(value="gxTokenSevice")
public class GXTokenSevice {
	/*这两个变量值个是由spring自动注入的*/
	private String valisession="v1.0";//密钥版本
	private String valisessionKey="Mysqlbykj";//密钥
	/*读取密钥及密钥版本*/
	public String getPassKey(){
//		 try {
//		    	Properties prop = new Properties();   
//		    	InputStream in = Object.class.getResourceAsStream("src/main/resources/jdbc.properties");   
//				prop.load(in);
//				passKey = prop.getProperty("valisessionKey").trim();   
//		        onbate = prop.getProperty("valisession").trim();  	
		        String passKey="";//最终生成的密钥，长度必须是8的整倍数
		        StringBuffer pstr=new StringBuffer();//补位密钥参数字符使用
		 		//密码，长度要是8的倍数,所以密码长度不是8的倍数优先用版本号补齐，如果还不够用abcd补齐 
		 		int a=valisessionKey.length();//计数密钥长度
		 		int b=valisession.length();//计数当前版本字符长度
		 		int c=8-a%8;//计算补位
		 		int e=a/8*8;//计算截取valisessionKey的起始位
		 		if(c!=0){
		 			int d=0;//补位的标准
		 			if(c>b){
		 				String buwei="abcd";
		 				d=c-b;
		 				//注意优先级 1.密钥本身2.版本号字符3.字符串“abcd”
		 				pstr=pstr.append(valisessionKey.substring(e,a)).append(valisession).append(buwei.substring(0, d));
		 			}else{	
		 				d=c-b;
		 				if(d!=0){
		 					pstr=pstr.append(valisessionKey.substring(e,a)).append(valisession.substring(0, Math.abs(d)));
		 					
		 				}else{
		 					pstr=pstr.append(valisessionKey.substring(e,a)).append(valisession);
		 				}
		 			}	
		 			passKey=pstr.toString();
		 		}    			         
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		return passKey;  
	} 
	/**
	 * @author kanghb  生成客户端与服务器交互的握手协议
	 * @param sessionid  当前会话取得的sessionId
	 * @param uid    当前用户的ID
	 * @param loginTime   当前用户登录的时间
	 * @param vbate   当前密钥的版本
	 * @return token  客户端与服务器交互的握手协议
	 * */
	public String getToken(String sessionId,int uid,String loginTime) {
		String  token="";//声明token，返回的参数
		String  passkey="";//密钥
		StringBuffer str=new StringBuffer();//转换加密参数字符使用
		str=str.append(sessionId).append("|").append(String.valueOf(uid)).append("|").append(loginTime).append("|").append(valisession);
		 if(str.toString().getBytes().length%2!=0){
			 str.append("|");
		 }
		//需要加密的字符数组
		try {	
			//加密后得到的字符数组
			passkey=this.getPassKey();
			token=DESUtil.encode(passkey, str.toString());
								
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return token;
	}

	
	/**
	 * @author kanghb  解析客户端与服务器交互的握手协议
	 * @param token  客户端与服务器交互的握手协议
	 * @return uid    当前用户的ID
	 * @return sessionId   当前用户登录的时间
	 * @return vbate   当前密钥的版本
	 * @return loginTime  客户端与服务器交互的握手协议
	 * */
	public String getAccessKey(String token) {
		String  accessKey="";//解密后的字符
		String  passkey="";//密钥
		//byte [] encryptStr=token.getBytes(); 
		try {
			passkey=this.getPassKey();
			accessKey=DESUtil.decode(passkey, token);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return accessKey;
	}
	
	
	
	public String getValisession() {
		return valisession;
	}
	public void setValisession(String valisession) {
		this.valisession = valisession;
	}
	public String getValisessionKey() {
		return valisessionKey;
	}
	public void setValisessionKey(String valisessionKey) {
		this.valisessionKey = valisessionKey;
	}
}
